package demo.singleton;

/**
 * @ClassName LazyStavingSingleton
 * @Description
 * @Author 47980
 * @Date 2020/6/14 9:27
 * @Version V_1.0
 **/
public class LazyStavingSingleton {
    private volatile static LazyStavingSingleton instance;
    private LazyStavingSingleton(){};
    public static LazyStavingSingleton getInstance() {
        // 第一次检测
        if (instance == null) {
            // 给目标对象上一个同步锁
            synchronized (LazyStavingSingleton.class) {
                if (instance == null) {
                    // 被volatile标识的对象,会被执行下面三个流程，防止2，3的顺序发生变化。
                    // memory = allocate(); //1.分配对象内存空间
                    // instance(memory); // 2.初始化对象
                    // instance = memory; // 设置instance指向刚分配的内存地址，此时instance!=null
                    instance = new LazyStavingSingleton();
                }
            }
        }
        return instance;
    }
}
